0094. 二叉树的中序遍历【简单】
1. 📝 题目描述
给定一个二叉树的根节点 root,返回它的中序遍历。
示例 1:

txt
输入:root = [1,null,2,3]
输出:[1,3,2]1
2
2
示例 2:
txt
输入:root = []
输出:[]1
2
2
示例 3:
txt
输入:root = [1]
输出:[1]1
2
2
提示:
- 树中节点数目在范围
[0, 100]内 -100 <= Node.val <= 100
进阶:递归算法很简单,你可以通过迭代算法完成吗?
2. 🎯 s.1 - 递归
js
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var inorderTraversal = function (root) {
const result = []
const traverse = (node) => {
if (!node) return
// 中序遍历:左 -> 根 -> 右
traverse(node.left)
result.push(node.val)
traverse(node.right)
}
traverse(root)
return result
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
js
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var inorderTraversal = function (root, res = []) {
if (!root) return res
inorderTraversal(root.left, res)
res.push(root.val)
inorderTraversal(root.right, res)
return res
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 时间复杂度:
,其中 n 是二叉树的节点数,需要遍历所有节点 - 空间复杂度:
,递归调用栈的深度最多为 n(最坏情况下树退化为链表)
算法思路:
- 中序遍历顺序:左子树 -> 根节点 -> 右子树
- 递归处理:先遍历左子树,再访问根节点,最后遍历右子树
- 将访问的节点值依次存入结果数组
3. 🎯 s.2 - 迭代
js
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var inorderTraversal = function (root) {
const result = []
const stack = []
let current = root
while (current !== null || stack.length > 0) {
// 一直往左子树走到底,将路径上的节点压入栈
while (current !== null) {
stack.push(current)
current = current.left
}
// 弹出栈顶节点并访问
current = stack.pop()
result.push(current.val)
// 转向右子树
current = current.right
}
return result
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
- 时间复杂度:
,其中 n 是二叉树的节点数,需要遍历所有节点 - 空间复杂度:
,栈的最大深度为 n
算法思路:
- 使用栈模拟递归过程,不断将左子节点压入栈
- 当无法继续左移时,弹出栈顶节点并访问
- 然后转向该节点的右子树继续处理